home *** CD-ROM | disk | FTP | other *** search
/ Aminet 35 / Aminet 35 (2000)(Schatztruhe)[!][Feb 2000].iso / Aminet / game / shoot / ADescentSrc.lha / descent / 2d / 2dsline.c next >
C/C++ Source or Header  |  1998-11-09  |  5KB  |  198 lines

  1. /*
  2. THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX
  3. SOFTWARE CORPORATION ("PARALLAX").  PARALLAX, IN DISTRIBUTING THE CODE TO
  4. END-USERS, AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN, GRANTS A
  5. ROYALTY-FREE, PERPETUAL LICENSE TO SUCH END-USERS FOR USE BY SUCH END-USERS
  6. IN USING, DISPLAYING,  AND CREATING DERIVATIVE WORKS THEREOF, SO LONG AS
  7. SUCH USE, DISPLAY OR CREATION IS FOR NON-COMMERCIAL, ROYALTY OR REVENUE
  8. FREE PURPOSES.  IN NO EVENT SHALL THE END-USER USE THE COMPUTER CODE
  9. CONTAINED HEREIN FOR REVENUE-BEARING PURPOSES.  THE END-USER UNDERSTANDS
  10. AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE.  
  11. COPYRIGHT 1993-1998 PARALLAX SOFTWARE CORPORATION.  ALL RIGHTS RESERVED.
  12. */
  13. /*
  14.  * $Source: /usr/CVS/descent/2d/2dsline.c,v $
  15.  * $Revision: 1.4 $
  16.  * $Author: nobody $
  17.  * $Date: 1998/11/09 22:20:05 $
  18.  *
  19.  * Graphical routines for drawing solid scanlines.
  20.  *
  21.  * $Log: 2dsline.c,v $
  22.  * Revision 1.4  1998/11/09 22:20:05  nobody
  23.  * *** empty log message ***
  24.  *
  25.  * Revision 1.3  1998/09/26 15:00:02  nobody
  26.  * Added Warp3D support
  27.  *
  28.  * Revision 1.2  1998/03/30 18:24:31  hfrieden
  29.  * ViRGE direct rendering added
  30.  *
  31.  * Revision 1.1.1.1  1998/03/03 15:11:45  nobody
  32.  * reimport after crash from backup
  33.  *
  34.  * Revision 1.1.1.1  1998/02/13  20:21:23  hfrieden
  35.  * Initial Import
  36.  *
  37.  */
  38.  
  39. #include "mem.h"
  40. #include "gr.h"
  41. #include "grdef.h"
  42. #include "asmdraw.h"
  43. #ifdef VIRGIN
  44. #include <exec/types.h>
  45. #include "VirgeTexture.h"
  46. #endif
  47.  
  48. #ifdef WARP3D
  49. #include "Warp3D.h"
  50. #endif
  51.  
  52. int Gr_scanline_darkening_level = GR_FADE_LEVELS;
  53.  
  54. void gr_linear_darken( ubyte * dest, int darkening_level, int count, ubyte * fade_table )
  55. {
  56.     int i;
  57.  
  58.     for (i=0; i<count; i++ )    {
  59.         *dest = fade_table[*dest+(darkening_level*256)];
  60.         dest++;
  61.     }
  62. }
  63.  
  64. void gr_linear_stosd( ubyte * dest, ubyte color, int count )
  65. {
  66.     int i, x;
  67.  
  68.     if (count > 3) {            
  69.         while ((int)(dest) & 0x3) { *dest++ = color; count--; };
  70.         if (count >= 4) {
  71.             x = (color << 24) | (color << 16) | (color << 8) | color;
  72.             while (count > 4) { *(int *)dest = x; dest += 4; count -= 4; };
  73.         }
  74.         while (count > 0) { *dest++ = color; count--; };
  75.     } else {
  76.         for (i=0; i<count; i++ )
  77.             *dest++ = color;
  78.     }
  79. }
  80.  
  81. void gr_uscanline( int x1, int x2, int y )
  82. {
  83. //  memset(DATA + ROWSIZE*y + x1, COLOR, x2-x1+0);
  84. //
  85.     if (Gr_scanline_darkening_level >= GR_FADE_LEVELS ) {
  86.         gr_linear_stosd( DATA + ROWSIZE*y + x1, COLOR, x2-x1+1);
  87.     } else {
  88.         gr_linear_darken( DATA + ROWSIZE*y + x1, Gr_scanline_darkening_level, x2-x1+1, gr_fade_table);
  89.     }
  90. }
  91.  
  92. void gr_scanline( int x1, int x2, int y )
  93. {
  94.     if ((y<0)||(y>MAXY)) return;
  95.  
  96.     if (x2 < x1 ) x2 ^= x1 ^= x2;
  97.  
  98.     if (x1 > MAXX) return;
  99.     if (x2 < MINX) return;
  100.  
  101.     if (x1 < MINX) x1 = MINX;
  102.     if (x2 > MAXX) x2 = MAXX;
  103.  
  104. //  memset(DATA + ROWSIZE*y + x1, COLOR, x2-x1+1);
  105. //  
  106.     if (Gr_scanline_darkening_level >= GR_FADE_LEVELS ) {
  107.         gr_linear_stosd( DATA + ROWSIZE*y + x1, COLOR, x2-x1+1);
  108.     } else {
  109.         gr_linear_darken( DATA + ROWSIZE*y + x1, Gr_scanline_darkening_level, x2-x1+1, gr_fade_table);
  110.     }
  111. }
  112.  
  113. #if defined(VIRGIN)
  114. void gr_direct_linear_darken( UWORD * dest, int darkening_level, int count, ubyte * fade_table )
  115. {
  116.     int i;
  117.     extern UWORD BitValues[256];
  118.  
  119.     for (i=0; i<count; i++ )    {
  120.         *dest = BitValues[fade_table[*dest+(darkening_level*256)]];
  121.         dest++;
  122.     }
  123. }
  124.  
  125. void gr_direct_scanline( int x1, int x2, int y )
  126. {
  127.     extern int VirgePixelsPerRow;
  128.     extern UWORD BitValues[256];
  129.  
  130.     UWORD *RenderBuffer = VirgeGetBuffer();
  131.  
  132.     UWORD FGColor = BitValues[COLOR];
  133.  
  134.  
  135.     if ((y<0)||(y>MAXY)) return;
  136.  
  137.     if (x2 < x1 ) x2 ^= x1 ^= x2;
  138.  
  139.     if (x1 > MAXX) return;
  140.     if (x2 < MINX) return;
  141.  
  142.     if (x1 < MINX) x1 = MINX;
  143.     if (x2 > MAXX) x2 = MAXX;
  144.  
  145. //  memset(DATA + ROWSIZE*y + x1, COLOR, x2-x1+1);
  146. //
  147.     if (Gr_scanline_darkening_level >= GR_FADE_LEVELS ) {
  148.         //gr_linear_stosd( DATA + ROWSIZE*y + x1, COLOR, x2-x1+1);
  149.         virge_repw(RenderBuffer+VirgePixelsPerRow*y+x1, x2-x1+1, FGColor);
  150.     } else {
  151.         gr_direct_linear_darken( RenderBuffer+VirgePixelsPerRow*y + x1,
  152.             Gr_scanline_darkening_level, x2-x1+1, gr_fade_table);
  153.     }
  154. }
  155.  
  156. #endif
  157.  
  158. #ifdef WARP3D
  159. void gr_direct_linear_darken( UWORD * dest, int darkening_level, int count, ubyte * fade_table )
  160. {
  161.     int i;
  162.  
  163.     for (i=0; i<count; i++ )    {
  164.         *dest = BitValues[fade_table[*dest+(darkening_level*256)]];
  165.         dest++;
  166.     }
  167. }
  168.  
  169. void gr_direct_scanline( int x1, int x2, int y )
  170. {
  171.     extern UWORD BitValues[256];
  172.  
  173.     UWORD *RenderBuffer = WARP_GetBufferAddress();
  174.  
  175.     UWORD FGColor = BitValues[COLOR];
  176.  
  177.  
  178.     if ((y<0)||(y>MAXY)) return;
  179.  
  180.     if (x2 < x1 ) x2 ^= x1 ^= x2;
  181.  
  182.     if (x1 > MAXX) return;
  183.     if (x2 < MINX) return;
  184.  
  185.     if (x1 < MINX) x1 = MINX;
  186.     if (x2 > MAXX) x2 = MAXX;
  187.  
  188.     if (Gr_scanline_darkening_level >= GR_FADE_LEVELS ) {
  189.         virge_repw(RenderBuffer+VirgePixelsPerRow*y+x1, x2-x1+1, FGColor);
  190.     } else {
  191.         gr_direct_linear_darken( RenderBuffer+VirgePixelsPerRow*y + x1,
  192.             Gr_scanline_darkening_level, x2-x1+1, gr_fade_table);
  193.     }
  194. }
  195.  
  196. #endif
  197.  
  198.